package com.lizemin.beanpostprocessor.extension;

import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

import java.util.Arrays;

/**
 * @author lzm
 * @date 2025/5/16 22:18
 * @description
 */
@Slf4j
public class ProxyUtil {

    @SuppressWarnings("unchecked")
    public static <T> T getProxy(Object target) {
        // 创建 Enhancer 对象
        Enhancer enhancer = new Enhancer();
        // 设置目标类的字节码对象
        enhancer.setSuperclass(target.getClass());
        // 设置方法拦截器
        enhancer.setCallback(getMethodInterceptor());
        // 创建代理对象
        return (T) enhancer.create();
    }

    /**
     * 获取方法拦截器
     * 有没有觉得这段代码和我们写的aop切面很类似？
     *
     * @return 方法拦截器
     */
    private static MethodInterceptor getMethodInterceptor() {
        return (obj, method, args, proxy) -> {
            log.info("请求的方法名为：{},请求的参数为：{}", method.getName(), Arrays.toString(args));
            Object result = proxy.invokeSuper(obj, args);
            log.info("方法的返回值为：{}", JSONUtil.toJsonPrettyStr(result));
            return result;
        };
    }

}
